import path from "path";

export class GetJsonwebtoken {
  getToken() {
    // 依赖：npm i jsonwebtoken

    // 基于服务账号生成鉴权令牌 步骤
    // 1.创建服务账号密钥文件。（1136852531741838851033private.json文件）
    // 2.生成JWT Header数据
    // 根据服务账号密钥文件中的key_id字段拼接以下JSON体，对JSON体进行BASE64编码。
    const Header = {
      kid: "461323198429733007", // 服务账号密钥文件中key_id字段。
      typ: "JWT", // 数据类型，固定为：JWT。
      alg: "PS256" // 算法类型，固定为：PS256。
    }
    // 3.生成JWT Payload数据。
    // 根据服务账号密钥文件中的sub_account字段拼接以下JSON体，对JSON体进行BASE64编码。
    const Payload = {
      aud: "https://oauth-login.cloud.huawei.com/oauth2/v3/token", // 固定为：https://oauth-login.cloud.huawei.com/oauth2/v3/token。
      iss: "113690827", // 服务账号密钥文件中sub_account字段，标识数据生成者。
      exp: Math.floor(Date.now() / 1000) + 3600, // ？ JWT到期UTC时间戳，比iat晚3600秒。
      iat: Math.floor(Date.now() / 1000) //  JWT签发UTC时间戳，为自UTC时间1970年1月1日00:00:00的秒数（您的服务器时间需要校准为标准时间）。
    }
    // 4.生成JWT。
    // 将完成BASE64编码后的Header字符串与Payload字符串，通过“.”进行连接，您可在业务应用中，通过服务账号密钥文件中的private_key（华为不进行存储，请您妥善保管），使用SHA256withRSA/PSS算法对拼接的字符串签名。
    const fs = require('fs');
    let private_key
    // 添加异常处理
    try {
      private_key = fs.readFileSync(
        path.resolve(__dirname, 'private_key.pem'),
        'utf8'
      );
    } catch (error) {
      console.error('密钥加载失败:', error);
      throw new Error('身份验证配置错误');
    }

    // 签署JWT
    const jwt = require('jsonwebtoken');
    const token = jwt.sign(Payload, private_key, { algorithm: 'PS256', header: Header });
    console.log("Generated JWT:", token);
    const Authorization = 'Bearer ' + token
    return {
      "token": token,
      "Authorization": Authorization
    }
  }
}
